06. 数据库设计原理与实践
1. 数据依赖与关系模式的范式化
1.1 数据依赖 (Data Dependency)
数据依赖描述了关系中属性之间存在的约束关系,是数据库设计中理解和消除数据冗余的基础。
1.1.1 函数依赖 (Function Dependency, FD)
- 定义:关系中一个或一组属性的值可以唯一确定另一个或一组属性的值。
- 表示:,表示属性集 函数决定属性集 。
- 重要性:FD 是最基本、最重要的数据库设计依赖类型。
- 用例:
- 在学生表
Student(学号, 姓名, 性别, 班级)
中,学号
可以唯一确定姓名
、性别
和班级
,即学号 -> 姓名, 性别, 班级
。 - 在课程表
Course(课程号, 课程名, 学分)
中,课程号
可以唯一确定课程名
和学分
,即课程号 -> 课程名, 学分
。
- 在学生表
1.1.2 多值依赖 (Multi-valued Dependency, MVD)
- 定义:关系中一个属性的值可以决定另一组属性的一组值,而不是单个值。
- 表示:,表示属性集 多值决定属性集 。
- 用例:假设有一个关系
Project(项目号, 员工号, 技能)
,一个项目可以有多个员工,一个员工可以有多种技能。如果项目号
确定了员工号
的一组值,并且项目号
也确定了技能
的一组值,那么可能存在多值依赖。例如,项目号
决定了参与该项目的所有员工,也决定了该项目所需的所有技能,且员工和技能之间没有直接关联。
1.1.3 连接依赖 (Join Dependency, JD)
- 定义:一个关系可以无损连接分解成多个子关系,这些子关系的自然连接等于原关系。
- 重要性:JD 是无损连接分解的约束条件,确保分解后的信息不丢失。
1.2 关系模式的范式 (Normal Forms)
范式是衡量关系模式规范化程度的标准,旨在消除数据冗余和更新异常。
1.2.1 第一范式 (First Normal Form, 1NF)
- 定义:关系中的每个属性都必须是原子性的 (atomic),即不可再分。
- 判断:检查每个属性的值是否都是单一的、不可再分的。
- 用例:
-
非 1NF 示例:
姓名 部门 地址 张三 销售 北京市朝阳区望京SOHO 李四 研发 上海市浦东新区陆家嘴 -
问题:
地址
属性包含省
、市
、街道
等多个信息,不是原子性的。 -
转换为 1NF:
姓名 部门 省 市 街道 张三 销售 北京 朝阳区 望京SOHO 李四 研发 上海 浦东新区 陆家嘴
-
1.2.2 第二范式 (Second Normal Form, 2NF)
- 定义:关系处于 1NF,并且不存在非主属性对码的部分函数依赖 (partially function dependency)。
- 部分函数依赖:指非主属性只依赖于码的一部分,而不是码的全部。
- 判断:
- 关系是否满足 1NF。
- 找出所有的码(候选码)。
- 检查是否存在非主属性只依赖于码的